package com.levy.contronller.javaWeb.findImageTest;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.StrUtil;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.PDFRenderer;
import org.junit.Test;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * Created by levy on 2019/4/23.
 */
public class PdfToPngTest {


    public static void main(String[] args) {
        PdfToPngTest test = new PdfToPngTest();
        String base64 = FileUtil.readUtf8String("F:\\pdf.txt");
        List<String> list = test.convertPdfBase64ToJpgBase64(base64);
        for (String s : list) {
            System.out.println(s);
        }
    }


    /**
     * @author levy
     * @description 转换pdf Base64为Jpg Base64
     * @date 2021/9/9 16:17
     * @param pdfBase64
     * @return java.util.List<java.lang.String>
     */
    public List<String> convertPdfBase64ToJpgBase64(String pdfBase64) {
        List<String> list = new ArrayList<>();
        try (PDDocument doc = getPDDocument(pdfBase64)) {
            PDFRenderer renderer = new PDFRenderer(doc);
            int pageCount = doc.getNumberOfPages();
            for (int i = 0; i < pageCount; i++) {
                BufferedImage image = renderer.renderImageWithDPI(i, 72);
                list.add(toJpgBase64(image));
                System.out.println(i + "_over");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return list;
    }

    public PDDocument getPDDocument(String pdfBase64) {
        PDDocument doc = null;
        try {
            if (StrUtil.isNotBlank(pdfBase64)) {
                byte[] pdf_bytes = new BASE64Decoder().decodeBuffer(pdfBase64);
                doc = PDDocument.load(pdf_bytes);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return doc;
    }


    /**
     * @author levy
     * @description 转换image为base64
     * @date 2021/9/9 16:16
     * @param imageResult
     * @return java.lang.String
     */
    public String toJpgBase64(BufferedImage imageResult) {
        String base64 = "";
        try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
            //写入流中
            ImageIO.write(imageResult, "png", baos);
            //转换成字节
            byte[] jpg_Bytes = baos.toByteArray();
            //转换成base64串
            base64 = new BASE64Encoder().encode(jpg_Bytes).trim();
            base64 = base64.replaceAll("\n", "")
                    .replaceAll("\r", "");
        } catch (IOException e) {
            e.printStackTrace();
        }
        return base64;
    }

    @Test
    public void covertBase64ToFile() {
        byte[] bytes = new byte[0];
        try {
            bytes = new BASE64Decoder().decodeBuffer(FileUtil.readUtf8String("F:\\2.txt"));
            FileUtil.writeBytes(bytes, "F:\\2.jpg");
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    @Test
    public void covertFileToBase64() {
        byte[] bytes = FileUtil.readBytes("F:\\ee.pdf");
        String encode = new BASE64Encoder().encode(bytes);
        encode = encode.replaceAll("\r", "").replaceAll("\n", "");
        FileUtil.writeUtf8String(encode, "F:\\base64.txt");
    }


//    合并PDF多个页到一个JPG长图
//    @Test
//    public void test() {
//        //这个base64是pdf的base64
////想转jpg就将下面的png改为jpg
//        String base64 = FileUtil.readUtf8String("F:\\1.txt");
//        if (StringUtils.isEmpty(base64)) {
//            System.out.println("空");
//        }
//        String jpg_base64 = null;
//        try {
//            // Base64解码
//            byte[] pdf_bytes = Base64Decoder.decode(base64);
//            PDDocument doc = PDDocument.load(pdf_bytes);
//            /*图像合并使用的参数*/
//            //定义宽度
//            int width = 0;
//            // 保存一张图片中的RGB数据
//            int[] singleImgRGB;
//            // 定义高度，后面用于叠加
//            int shiftHeight = 0;
//            //保存每张图片的像素值
//            BufferedImage imageResult = null;
//            // 利用PdfBox生成图像
//            PDDocument pdDocument = doc;
//            PDFRenderer renderer = new PDFRenderer(pdDocument);
//            /*根据总页数, 按照50页生成一张长图片的逻辑, 进行拆分*/
//            // 每50页转成1张图片
//            int pageLength = doc.getNumberOfPages(); //有多少转多少
//            int numberOfPages = pdDocument.getNumberOfPages();
//            // 总计循环的次数
//            int totalCount = numberOfPages / pageLength + 1;
//            for (int m = 0; m < totalCount; m++) {
//                for (int i = 0; i < pageLength; i++) {
//                    int pageIndex = i + (m * pageLength);
//                    if (pageIndex == numberOfPages) {
//                        System.out.println("循环次数 m = " + m);
//                        break;
//                    }
//                    // 96为图片的dpi，dpi越大，则图片越清晰，图片越大，转换耗费的时间也越多
//                    BufferedImage image = renderer.renderImageWithDPI(pageIndex, 106, ImageType.RGB);
//                    int imageHeight = image.getHeight();
//                    int imageWidth = image.getWidth();
//                    if (i == 0) {
//                        //计算高度和偏移量
//                        //使用第一张图片宽度;
//                        width = imageWidth;
//                        // 保存每页图片的像素值
//                        // 加个判断：如果m次循环后所剩的图片总数小于pageLength，则图片高度按剩余的张数绘制，
//                        // 否则会出现长图片下面全是黑色的情况
//                        if ((numberOfPages - m * pageLength) < pageLength) {
//                            imageResult = new BufferedImage(width, imageHeight * (numberOfPages - m * pageLength), BufferedImage.TYPE_INT_RGB);
//                        } else {
//                            imageResult = new BufferedImage(width, imageHeight * pageLength, BufferedImage.TYPE_INT_RGB);
//                        }
//                    } else {
//                        // 将高度不断累加
//                        shiftHeight += imageHeight;
//                    }
//                    singleImgRGB = image.getRGB(0, 0, width, imageHeight, null, 0, width);
//                    imageResult.setRGB(0, shiftHeight, width, imageHeight, singleImgRGB, 0, width);
//                }
//                // 这个很重要，下面会有说明
//                shiftHeight = 0;
//            }
//            pdDocument.close();
//            jpg_base64 = toJpgBase64(imageResult);
//            doc.close();
////            System.out.println(jpg_base64);
//            FileUtil.writeUtf8String(jpg_base64, "F:\\2.txt");
//        } catch (IOException e) {
//            e.printStackTrace();
//        }
//    }


}
